#include "my_stdio.h"
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
M_FILE* mfopen(const char*filename,const char* mode)//打开文件
{
    //描述符
    int fd = -1;
    if(strcmp(mode,"r") == 0)
    {
        //只读
        fd = open(filename,O_RDONLY);
    }
    else if(strcmp(mode,"w") == 0)
    {
        //写入
        fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);
    }
    else if(strcmp(mode,"a") == 0)
    {
        //追加写入
        fd = open(filename,O_WRONLY|O_CREAT|O_APPEND,0666);
    }
    //文件打开失败，返回NULL
    if(fd < 0) return NULL;


    //申请空间
    M_FILE* mf = (M_FILE*)malloc(sizeof(M_FILE));
    //空间申请失败关闭文件，返回NULL
    if(mf == NULL) 
    {
        //关闭文件
        close(fd);
        return NULL;
    }
    //将M_FILE结构体初始化
    //我们默认行刷新
    mf->flag = FLUSH_LINE;
    mf->fileno = fd;
    mf->cap = SIZE;
    mf->size = 0;


    return mf;
}

//刷新到文件的内核缓冲区
void fflush(M_FILE* stream)
{
    //用户缓冲区有数据才刷新
    if(stream->size > 0)
    {
        //通过系统调用写到文件的内核缓冲区
        write(stream->fileno,stream->buffer,stream->size);
        //将用户缓冲区-元素个数置为0
        stream->size = 0;
    }
}

//写入-本质上是写到缓冲区里
int mfwrite(const void* ptr,int num,M_FILE *stream)//写入-本质上是写到缓冲区里
{
    //拷贝到用户缓冲区
    emecpy(stream->buffer+stream->size , ptr , num);
    stream->size += num;

    //2.检测是否要刷新
    if(stream->flag == FLUSH_NONE && stream->size > 0 && stream->buffer[stream->size-1] == '\n')
    {
        mfflush(stream);
    }
    return num;

}
void mfclose(M_FILE* stream)//关闭文件
{
    //size大于0，说明用户缓冲区有数据
    if(stream->size > 0)
    {
        //进行刷新到文件的内核缓冲区
        mfflush(stream);
    }
    //再进行关闭文件
    close(stream->fileno);
}

//void mfflush(M_FILE* stream);//刷新缓冲区
//void mfclose(M_FILE* stream);//关闭文件
